package org.lora.biz.workflow.engines;

import java.util.List;
import java.util.Map;

import org.lora.biz.workflow.engines.bean.ActivityDefinitionBean;
import org.lora.biz.workflow.engines.bean.ProcessDefinitionBean;
import org.lora.biz.workflow.exception.LoraWorkflowException;
import org.lora.exception.LoraCoreException;
import org.lora.exception.MongoDBException;

/**
 * <p>
 * 类名:IProcessDefinitionService
 * </p>
 * 描述:<br>
 * 创建时间:2016年4月28日 上午9:32:35<br>
 * 
 * @author Bladnir@outlook.com<br>
 *         修改历史:<br>
 *         2016年4月28日 Bladnir 创建<br>
 */
public interface IProcessDefinitionService {

	/**
	 * 保存流程定义数据
	 * 
	 * @param version
	 *            版本号
	 * @param processDefinitionId
	 *            流程定义ID
	 * @param resourceId
	 *            资源ID
	 * @param flowData
	 *            流程数据json字符串
	 * @throws LoraWorkflowException
	 * @throws MongoDBException
	 */
	public void saveFlowResourceData(String version, String processDefinitionId, String resourceId, String flowData)
			throws LoraCoreException;

	/**
	 * 获取流程定义资源字符串
	 * 
	 * @param resourceId
	 *            资源ID
	 * @return
	 * @throws LoraWorkflowException
	 * @throws MongoDBException
	 */
	public String getFlowResource(String resourceId) throws LoraCoreException;

	/**
	 * 根据流程定义ID 查询流程定义
	 * 
	 * @param processDefinitionId
	 *            流程定义ID
	 * @return
	 * @throws LoraCoreException
	 */
	public ProcessDefinitionBean getProcessDefById(String processDefinitionId) throws LoraCoreException;

	// /////////////////////////////////////////////////////////////////////////////////////////////////////////////////

	/**
	 * 根据流程定义和节点ID获取环节定义信息<br>
	 * 如果节点ID不传 则获取起草节点的信息<br>
	 * 如果版本号为空 则获取当前生效的版本
	 * 
	 * @param processDefinitionEntity
	 *            流程定义实体
	 * @param activityDefId
	 *            环节定义ID
	 * @param version
	 *            版本号
	 * @return
	 * @throws LoraCoreException
	 */
	public ActivityDefinitionBean getProcessDefinitionActivity(ProcessDefinitionBean processDefinitionEntity, String activityDefId,
			String version) throws LoraCoreException;

	/**
	 * 获取域下的所有流程定义和版本(格式化成为zTree需要的数据)
	 * 
	 * @param domainId
	 * @return
	 * @throws LoraCoreException
	 */
	public List<Map<String, Object>> getProcessDefinitionTreeData(String domainId) throws LoraCoreException;

}
